Introduction

Resolving geographic units that do not neatly coincide is a common problem in spatial data analysis. This method attempts to conflate King County Health Reporting Areas (HRAs) to US Census tracts. In the cases where a given tract with entirely within a HRA, that tract receives the HRA’s ID. Where a given tract overlaps multiple HRAs block-level census data is used to determine which HRA ID to assign to the tract.

Census Block Counts

This method provides three alternatives of block-level counts that can be used:

The Algorithm

The following actions are performed in this method:

  1. Centroids of the census block polygons are calculated (class = SpatialPointsDataFrame)
  2. HRA IDs are passed to the block centroid using a spatial overlay method (sp::over())
  3. Blocks are aggregated into tracts and the count variables (POP,HU,POPHU) are summed
  4. For each count variable, the HRA ID with the highest sum is assigned to each tract

After running the assignment algorithm, it is clear that the POP and POPHU variables result in the same HRA assignments. HU differs from the other two variables in three of the tracts:

GEOID_TR HRA_POP HRA_POPHU HRA_HU
53033022202 Kirkland North Kirkland North Kirkland
53033025001 Bellevue-South Bellevue-South Newcastle/Four Creeks
53033028801 SeaTac/Tukwila SeaTac/Tukwila Des Moines/Normandy Park

Maps

LS0tCmRmX3ByaW50OiB0aWJibGUKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICBwZGZfZG9jdW1lbnQ6CiAgICBrZWVwX3RleDogeWVzCmFsd2F5c19hbGxvd19odG1sOiB5ZXMKLS0tCgpgYGB7ciBocmEtdHItc2V0dXAsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGNvbW1lbnQ9RkFMU0V9CmxpYnJhcnkocGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShycHJvanJvb3QpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJnZGFsKQpsaWJyYXJ5KHNwKQpsaWJyYXJ5KHJnZW9zKQpsaWJyYXJ5KG1pc2NnaXMpCmxpYnJhcnkodGlncmlzKQpsaWJyYXJ5KGxlYWZsZXQpCmxpYnJhcnkoZ2d0aGVtZXMpCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShkb3dubG9hZGVyKQpsaWJyYXJ5KHdlYnNob3QpCmxpYnJhcnkoaHRtbHRvb2xzKQpsaWJyYXJ5KGdwbG90cykKbGlicmFyeShnZ21hcCkKbGlicmFyeShzaGlueSkKbGlicmFyeShodG1sd2lkZ2V0cykKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoYWNzKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKcm9vdCA8LSBycHJvanJvb3Q6OmlzX3JzdHVkaW9fcHJvamVjdApyb290X2ZpbGUgPC0gcm9vdCRtYWtlX2ZpeF9maWxlKCkKb3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgY29tbWVudD1GQUxTRSkKYGBgCgojIyMgSW50cm9kdWN0aW9uClJlc29sdmluZyBnZW9ncmFwaGljIHVuaXRzIHRoYXQgZG8gbm90IG5lYXRseSBjb2luY2lkZSBpcyBhIGNvbW1vbiBwcm9ibGVtIGluIHNwYXRpYWwgZGF0YSBhbmFseXNpcy4gVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gY29uZmxhdGUgS2luZyBDb3VudHkgSGVhbHRoIFJlcG9ydGluZyBBcmVhcyAoSFJBcykgdG8gVVMgQ2Vuc3VzIHRyYWN0cy4gSW4gdGhlIGNhc2VzIHdoZXJlIGEgZ2l2ZW4gdHJhY3Qgd2l0aCBlbnRpcmVseSB3aXRoaW4gYSBIUkEsIHRoYXQgdHJhY3QgcmVjZWl2ZXMgdGhlIEhSQSdzIElELiBXaGVyZSBhIGdpdmVuIHRyYWN0IG92ZXJsYXBzIG11bHRpcGxlIEhSQXMgYmxvY2stbGV2ZWwgY2Vuc3VzIGRhdGEgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggSFJBIElEIHRvIGFzc2lnbiB0byB0aGUgdHJhY3QuIAoKCiMjIyBDZW5zdXMgQmxvY2sgQ291bnRzClRoaXMgbWV0aG9kIHByb3ZpZGVzIHRocmVlIGFsdGVybmF0aXZlcyBvZiBibG9jay1sZXZlbCBjb3VudHMgdGhhdCBjYW4gYmUgdXNlZDoKCiAgKiBQb3B1bGF0aW9uCiAgKiBIb3VzaW5nIFVuaXRzCiAgKiBQb3B1bGF0aW9uIGluIEhvdXNpbmcgVW5pdHMKICAKCmBgYHtyIGhyYS10ci1ibGtzfQoKaWYoIWZpbGUuZXhpc3RzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS9rYy1ibGstc3AuZ3BrZycpKSl7CiAgICAgICAgcG9wIDwtIHJlYWRfY3N2KHJvb3RfZmlsZSgnMS1kYXRhLzMtZXh0ZXJuYWwvbWFudWFsL3dhLWJsay9ERUNfMTBfU0YxX1AxL0RFQ18xMF9TRjFfUDFfd2l0aF9hbm4uY3N2JyksIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKEdFT19JRF9CTEsgPSBJZDIsCiAgICAgICAgICAgICAgICAgICAgICAgR0VPSURfVFIgPSBzdWJzdHIoSWQyLHN0YXJ0ID0gMSxzdG9wID0gMTEpLAogICAgICAgICAgICAgICAgICAgICAgIFBPUCA9IFRvdGFsKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPX0lEX0JMSyxHRU9JRF9UUixQT1ApCiAgICAgICAgCiAgICAgICAgaHUgPC0gcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvd2EtYmxrL0RFQ18xMF9TRjFfSDEvREVDXzEwX1NGMV9IMV93aXRoX2Fubi5jc3YnKSwgCiAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyhJZDIgPSBjb2xfY2hhcmFjdGVyKCkpLCAKICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKEdFT19JRF9CTEsgPSBJZDIsCiAgICAgICAgICAgICAgICAgICAgICAgSFUgPSBUb3RhbCkgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KEdFT19JRF9CTEssSFUpCiAgICAgICAgCiAgICAgICAgcG9waHUgPC0gcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvd2EtYmxrL0RFQ18xMF9TRjFfSDEwL0RFQ18xMF9TRjFfSDEwX3dpdGhfYW5uLmNzdicpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxKSAlPiUgCiAgICAgICAgICAgICAgICBtdXRhdGUoR0VPX0lEX0JMSyA9IElkMiwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVSA9IFRvdGFsKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPX0lEX0JMSyxQT1BIVSkKICAgICAgICAKICAgICAgICBjbnRzIDwtIGxlZnRfam9pbihwb3AsaHUsYnkgPSAnR0VPX0lEX0JMSycpICU+JSAKICAgICAgICAgICAgICAgIGxlZnRfam9pbihwb3BodSxieSA9ICdHRU9fSURfQkxLJykKICAgICAgICAKICAgICAgICAjIFNvdXJjZSBmb3IgS0MgQmxvY2tzIHNwYXRpYWwgZGF0YQogICAgICAgIGlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL3dhLWJsay9ibG9ja3MxMC9ibG9ja3MxMC5zaHAnKSkpewogICAgICAgICAgICAgICAgdXJsIDwtICdmdHA6Ly9mdHAua2luZ2NvdW50eS5nb3YvZ2lzLXdlYi93ZWIvR0lTRGF0YS9ibG9ja3MxMF9TSFAuemlwJyAjIGRpcmVjdCBVUkwgdG8gdGhlIGZpbGUgZG93bmxvYWQKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGVtcCA8LSB0ZW1wZmlsZSgpICMgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gaG9sZCB0aGUgY29tcHJlc3NlZCBkb3dubG9hZAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBkb3dubG9hZCh1cmwsIGRlc3QgPSB0ZW1wLCBtb2RlPSd3YicpICMgZG93bmxvYWQgdGhlIGZpbGUKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdW56aXAgKHRlbXAsIGV4ZGlyID0gcm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC93YS1ibGsnKSkgIyBleHRyYWN0IHRoZSBmaWxlIHRvIHRoZSBwcm9qZWN0IGZvbGRlcgogICAgICAgIH0KICAgICAgICAKICAgICAgICBrY19ibGsgPC0gcmVhZE9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL3dhLWJsay9ibG9ja3MxMC8nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9ICdibG9ja3MxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICAgICAKICAgICAgICBrY19ibGtAZGF0YSAlPD4lIGxlZnRfam9pbihjbnRzLCBieSA9ICdHRU9fSURfQkxLJykgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KEdFT0lEX0JMSyA9IEdFT19JRF9CTEssCiAgICAgICAgICAgICAgICAgICAgICAgR0VPSURfVFI6UE9QSFUpCiAgICAgICAgCiAgICAgICAga2NfYmxrICU+JSB3cml0ZU9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2MtYmxrLXNwLmdwa2cnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyID0gJ2tjX2Jsa19zcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgPSAnR1BLRycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVfbGF5ZXIgPSBUUlVFLHZlcmJvc2UgPSBGQUxTRSkKfQoKa2NfYmxrX3NwIDwtIHJlYWRPR1IoZHNuID0gcm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL2tjLWJsay1zcC5ncGtnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9ICdrY19ibGtfc3AnLAogICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkKCgoKYGBgCgoKIyMjIFRoZSBBbGdvcml0aG0gClRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgbWV0aG9kOgoKICAxLiBDZW50cm9pZHMgb2YgdGhlIGNlbnN1cyBibG9jayBwb2x5Z29ucyBhcmUgY2FsY3VsYXRlZCAoYGNsYXNzID0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZWApCiAgMi4gSFJBIElEcyBhcmUgcGFzc2VkIHRvIHRoZSBibG9jayBjZW50cm9pZCB1c2luZyBhIHNwYXRpYWwgb3ZlcmxheSBtZXRob2QgKGBzcDo6b3ZlcigpYCkKICAzLiBCbG9ja3MgYXJlIGFnZ3JlZ2F0ZWQgaW50byB0cmFjdHMgYW5kIHRoZSBjb3VudCB2YXJpYWJsZXMgKGBQT1BgLGBIVWAsYFBPUEhVYCkgYXJlIHN1bW1lZAogIDQuIEZvciBlYWNoIGNvdW50IHZhcmlhYmxlLCB0aGUgSFJBIElEIHdpdGggdGhlIGhpZ2hlc3Qgc3VtIGlzIGFzc2lnbmVkIHRvIGVhY2ggdHJhY3QKICAKYGBge3IgaHJhLWFzc2lnbn0KCiMgUGFzcyBIUkEgSURzIHRvIHRoZSBibG9jayBjZW50cm9pZHMKaHJhIDwtIHJlYWRPR1IoZHNuID0gcm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvSFJBXzIwMTBCbG9ja19DbGlwLycpLGxheWVyID0gJ0hSQV8yMDEwQmxvY2tfQ2xpcCcsCiAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSxzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgprY19ibGtfY250X3NwIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUoY29vcmRzID0gcmdlb3M6OmdDZW50cm9pZChrY19ibGtfc3AsYnlpZCA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFzLmRhdGEuZnJhbWUoa2NfYmxrX3NwQGRhdGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2guSUQgPSBGQUxTRSkKCmtjX2Jsa19jbnRfc3AkSFJBX0lEIDwtIHNwOjpvdmVyKGtjX2Jsa19jbnRfc3AsaHJhWywnSFJBMjAxMHYyXyddKSAlPiUgdW5saXN0CgprY19ibGtfY250X3NwQGRhdGEgJTw+JSBtdXRhdGUoSFJBX0lEID0gaWZlbHNlKGlzLm5hKEhSQV9JRCksJ05vbmUnLEhSQV9JRCkpCgoKIyBBc3NpZ24gSFJBcyB0byB0cmFjdHMKIAppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL2tjLWhyYS10ci1zcC5ncGtnJykpKXsKICAgICAgICBpZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9rYy10ci90cmFjdHMxMF9zaG9yZS90cmFjdHMxMF9zaG9yZS5zaHAnKSkpewogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB1cmwgPC0gJ2Z0cDovL2Z0cC5raW5nY291bnR5Lmdvdi9naXMtd2ViL3dlYi9HSVNEYXRhL3RyYWN0czEwX3Nob3JlX1NIUC56aXAnICMgZGlyZWN0IFVSTCB0byB0aGUgZmlsZSBkb3dubG9hZAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0ZW1wIDwtIHRlbXBmaWxlKCkgIyBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byBob2xkIHRoZSBjb21wcmVzc2VkIGRvd25sb2FkCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRvd25sb2FkKHVybCwgZGVzdCA9IHRlbXAsIG1vZGU9J3diJykgIyBkb3dubG9hZCB0aGUgZmlsZQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB1bnppcCAodGVtcCwgZXhkaXIgPSByb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL2tjLXRyJykpICMgZXh0cmFjdCB0aGUgZmlsZSB0byB0aGUgcHJvamVjdCBmb2xkZXIKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgICAKICAgICAgICBrY190cl9zcCA8LSByZWFkT0dSKGRzbiA9IHJvb3RfZmlsZSgnMS1kYXRhLzMtZXh0ZXJuYWwva2MtdHIvdHJhY3RzMTBfc2hvcmUvJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9ICd0cmFjdHMxMF9zaG9yZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgICAgICAga2NfdHJfc3BAZGF0YSAlPD4lIHNlbGVjdChHRU9JRF9UUiA9IEdFT19JRF9UUlQpCiAgICAgICAgCiAgICAgICAgZmlyc3Rfbm90TkEgPC0gZnVuY3Rpb24oeCl7Zmlyc3QoeFshaXMubmEoeCldKX0KICAgICAgICAKICAgICAgICB0cl9ocmFfaWRzIDwtIAogICAgICAgICAgICAgICAga2NfYmxrX2NudF9zcEBkYXRhICU+JSAKICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgICAgICAgICAgICAgICBnYXRoZXIoJ1ZBUicsJ0NPVU5UJyxQT1A6UE9QSFUpICU+JSAKICAgICAgICAgICAgICAgIGdyb3VwX2J5KEdFT0lEX1RSLFZBUixIUkFfSUQpICU+JSAKICAgICAgICAgICAgICAgIHN1bW1hcmlzZShTVU0gPSBzdW0oQ09VTlQpKSAlPiUgCiAgICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MoU1VNKSkgJT4lIAogICAgICAgICAgICAgICAgc2xpY2UoMSkgJT4lIAogICAgICAgICAgICAgICAgc3ByZWFkKFZBUixIUkFfSUQpICU+JSAKICAgICAgICAgICAgICAgIG11dGF0ZShIVV9DTlQgPSBpZmVsc2UoIWlzLm5hKEhVKSxTVU0sTkFfaW50ZWdlcl8pLAogICAgICAgICAgICAgICAgICAgICAgIFBPUF9DTlQgPSBpZmVsc2UoIWlzLm5hKFBPUCksU1VNLE5BX2ludGVnZXJfKSwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVV9DTlQgPSBpZmVsc2UoIWlzLm5hKFBPUEhVKSxTVU0sTkFfaW50ZWdlcl8pKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoLVNVTSkgJT4lIAogICAgICAgICAgICAgICAgZ3JvdXBfYnkoR0VPSURfVFIpICU+JSAKICAgICAgICAgICAgICAgIHN1bW1hcmlzZV9hbGwoZnVucyhmaXJzdF9ub3ROQSkpICU+JSAKICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPSURfVFIsCiAgICAgICAgICAgICAgICAgICAgICAgUE9QID0gUE9QX0NOVCwKICAgICAgICAgICAgICAgICAgICAgICBIVSA9IEhVX0NOVCwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVSA9IFBPUEhVX0NOVCwKICAgICAgICAgICAgICAgICAgICAgICBIUkFfUE9QID0gUE9QLAogICAgICAgICAgICAgICAgICAgICAgIEhSQV9IVSA9IEhVLAogICAgICAgICAgICAgICAgICAgICAgIEhSQV9QT1BIVSA9IFBPUEhVKQogICAgICAgIAogICAgICAgIHRyX2hyYV9pZHMyIDwtIAogICAgICAgICAgICAgICAgdHJfaHJhX2lkcyAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPSURfVFIsbWF0Y2hlcygnSFJBJykpICU+JSAKICAgICAgICAgICAgICAgIGdhdGhlcigiVkFSIiwiSFJBIixtYXRjaGVzKCdIUkEnKSkgJT4lICAKICAgICAgICAgICAgICAgIGdyb3VwX2J5KEdFT0lEX1RSKSAlPiUgCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoQUxMRVEgPSBsZW5ndGgodW5pcXVlKEhSQSkpPT0xKSAlPiUKICAgICAgICAgICAgICAgIGxlZnRfam9pbih0cl9ocmFfaWRzLC4sYnkgPSAnR0VPSURfVFInKSAKICAgICAgICAKICAgICAgICAjIEdldCB0aGUgcGVyY2VudGFnZSBmb3IgZWFjaCBjb3VudCB2YXJpYWJsZQogICAgICAgIAogICAgICAgIHBvcF90ciA8LSAKICAgICAgICAgICAgICAgIHJlYWRfY3N2KHJvb3RfZmlsZSgiMS1kYXRhLzMtZXh0ZXJuYWwvbWFudWFsL2tjLXRyL0RFQ18xMF9TRjFfUDEvREVDXzEwX1NGMV9QMV93aXRoX2Fubi5jc3YiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKEdFTy5pZDIgPSBjb2xfY2hhcmFjdGVyKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW9ncmFwaHkgPSBjb2xfc2tpcCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWQgPSBjb2xfc2tpcCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWQyID0gY29sX2NoYXJhY3RlcigpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KEdFT0lEX1RSID0gSWQyLAogICAgICAgICAgICAgICAgICAgICAgIFBPUF9UUiA9IFRvdGFsKQogICAgICAgIAogICAgICAgIGh1X3RyIDwtIAogICAgICAgICAgICAgICAgcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwva2MtdHIvREVDXzEwX1NGMV9IMS9ERUNfMTBfU0YxX0gxX3dpdGhfYW5uLmNzdicpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGNvbHMoR0VPLmlkMiA9IGNvbF9jaGFyYWN0ZXIoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlb2dyYXBoeSA9IGNvbF9za2lwKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZCA9IGNvbF9za2lwKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZDIgPSBjb2xfY2hhcmFjdGVyKCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxKSU+JSAKICAgICAgICAgICAgICAgIHNlbGVjdChHRU9JRF9UUiA9IElkMiwKICAgICAgICAgICAgICAgICAgICAgICBIVV9UUiA9IFRvdGFsKQogICAgICAgIAogICAgICAgIHBvcGh1X3RyIDwtIAogICAgICAgICAgICAgICAgcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwva2MtdHIvREVDXzEwX1NGMV9IMTAvREVDXzEwX1NGMV9IMTBfd2l0aF9hbm4uY3N2JyksIAogICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyhHRU8uaWQyID0gY29sX2NoYXJhY3RlcigpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VvZ3JhcGh5ID0gY29sX3NraXAoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkID0gY29sX3NraXAoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDEpICU+JSAKICAgICAgICAgICAgICAgIHNlbGVjdChHRU9JRF9UUiA9IElkMiwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVV9UUiA9IFRvdGFsKQogICAgICAgIAogICAgICAgIGtjX3RyX3NwQGRhdGEgJTw+JQogICAgICAgICAgICAgICAgbGVmdF9qb2luKC4sdHJfaHJhX2lkczIsYnkgPSAnR0VPSURfVFInKSAlPiUgCiAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oLixwb3BfdHIsYnkgPSAnR0VPSURfVFInKSAlPiUgCiAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oLixodV90cixieSA9ICdHRU9JRF9UUicpICU+JSAKICAgICAgICAgICAgICAgIGxlZnRfam9pbiguLHBvcGh1X3RyLGJ5ID0gJ0dFT0lEX1RSJykgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKFBPUF9QQ1QgPSByb3VuZF9hbnkoUE9QL1BPUF9UUixhY2N1cmFjeSA9IC4wMSksCiAgICAgICAgICAgICAgICAgICAgICAgSFVfUENUID0gcm91bmRfYW55KEhVL0hVX1RSLGFjY3VyYWN5ID0gLjAxKSwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVV9QQ1QgPSByb3VuZF9hbnkoUE9QSFUvUE9QSFVfVFIsYWNjdXJhY3kgPSAuMDEpKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPSURfVFIsCiAgICAgICAgICAgICAgICAgICAgICAgUE9QLFBPUF9QQ1QsCiAgICAgICAgICAgICAgICAgICAgICAgSFUsIEhVX1BDVCwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVSwgUE9QSFVfUENULGV2ZXJ5dGhpbmcoKSkKICAgICAgICAKICAgICAgICBrY190cl9zcCAlPiUgCiAgICAgICAgICAgICAgICB3cml0ZU9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2MtaHJhLXRyLXNwLmdwa2cnKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyID0gJ2tjX2hyYV90cl9zcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgPSAnR1BLRycsCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVfbGF5ZXIgPSBUUlVFKQogICAgICAgIAp9CgprY19ocmFfdHJfc3AgPC0gCiAgICAgICAgcmVhZE9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2MtaHJhLXRyLXNwLmdwa2cnKSwKICAgICAgICAgICAgICAgIGxheWVyID0gJ2tjX2hyYV90cl9zcCcsCiAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UpICU+JSAKICAgICAgICBzcFRyYW5zZm9ybShjcnNfcHJvaikKCmBgYAoKQWZ0ZXIgcnVubmluZyB0aGUgYXNzaWdubWVudCBhbGdvcml0aG0sIGl0IGlzIGNsZWFyIHRoYXQgdGhlIGBQT1BgIGFuZCBgUE9QSFVgIHZhcmlhYmxlcyByZXN1bHQgaW4gdGhlIHNhbWUgSFJBIGFzc2lnbm1lbnRzLiBgSFVgIGRpZmZlcnMgZnJvbSB0aGUgb3RoZXIgdHdvIHZhcmlhYmxlcyBpbiB0aHJlZSBvZiB0aGUgdHJhY3RzOgoKYGBge3IgaHJhLWFzc2lnbi1yZXN1bHRzLCBmaWcuY2FwPSdEaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1ldGhvZHMnfQoKa2NfaHJhX3RyX3NwQGRhdGEgJT4lIAogICAgICAgIG11dGF0ZShBTExFUSA9IGFzLmxvZ2ljYWwoQUxMRVEpKSAlPiUgCiAgICAgICAgZmlsdGVyKEFMTEVRID09IEZBTFNFKSAlPiUgCiAgICAgICAgc2VsZWN0KEdFT0lEX1RSLEhSQV9QT1AsSFJBX1BPUEhVLEhSQV9IVSkgJT4lIAogICAgICAgIGthYmxlKCkKCmBgYAoKCiMjIyBNYXBzCgoKYGBge3IgaHJhLW1ha2UtbWFwc30KCm15cGFsIDwtIFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LG5hbWUgPSAnU2V0MicpWy04XQoKc2h1ZmZsZWRfaHJhX3BvcCA8LSBmb3JjYXRzOjpmY3Rfc2h1ZmZsZShrY19ocmFfdHJfc3AkSFJBX1BPUCkgJT4lIGZhY3RvcihvcmRlcmVkID0gVCkKc2h1ZmZsZWRfaHJhX2h1IDwtIGZvcmNhdHM6OmZjdF9zaHVmZmxlKGtjX2hyYV90cl9zcCRIUkFfSFUpICU+JSBmYWN0b3Iob3JkZXJlZCA9IFQpCnNodWZmbGVkX2hyYV9wb3BodSA8LSBmb3JjYXRzOjpmY3Rfc2h1ZmZsZShrY19ocmFfdHJfc3AkSFJBX1BPUEhVKSAlPiUgZmFjdG9yKG9yZGVyZWQgPSBUKQoKcGFsX3BvcCA8LSBjb2xvckZhY3RvcihwYWxldHRlID0gbXlwYWwsZG9tYWluID0gc2h1ZmZsZWRfaHJhX3BvcCkKcGFsX2h1IDwtIGNvbG9yRmFjdG9yKHBhbGV0dGUgPSBteXBhbCxkb21haW4gPSBzaHVmZmxlZF9ocmFfaHUpCnBhbF9wb3BodSA8LSBjb2xvckZhY3RvcihwYWxldHRlID0gbXlwYWwsZG9tYWluID0gc2h1ZmZsZWRfaHJhX3BvcGh1KQoKaHJhICU8PiUgc3BUcmFuc2Zvcm0oY3JzX3Byb2opCgpzaG93X2hyYV90cl9wb3AgPC0gZnVuY3Rpb24oKXsKICAgICAgICBteUxmbHRHcmV5KGJ1bXBMYWJlbHMgPSBGQUxTRSxoaWRlQ29udHJvbHMgPSBGQUxTRSkgJT4lCiAgICAgICAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQikgJT4lIAogICAgICAgIGFkZFBvbHlnb25zKGRhdGEgPSBrY19ocmFfdHJfc3AsCiAgICAgICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMCwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgPSAxLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gY29sMmhleCgid2hpdGUiKSwKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gLjg1LAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWxfcG9wKHNodWZmbGVkX2hyYV9wb3ApLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjUsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAnSFJBIFRyYWN0IGJ5IFBvcC4nLAogICAgICAgICAgICAgICAgICAgIHBvcHVwID0gfnBhc3RlMChrY19ocmFfdHJfc3AkR0VPSURfVFIpKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGhyYSwKICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgPSAyLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gfnBhbF9wb3AoZmFjdG9yKGhyYSRIUkEyMDEwdjJfLGxldmVscyA9IGxldmVscyhzaHVmZmxlZF9ocmFfcG9wKSxvcmRlcmVkID0gVFJVRSkpLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLAogICAgICAgICAgICAgICAgICAgIGdyb3VwID0gJ0hSQXMnLAogICAgICAgICAgICAgICAgICAgIHBvcHVwID0gfnBhc3RlMChocmEkSFJBMjAxMHYyXykpICU+JSAKICAgICAgICBhZGRMYXllcnNDb250cm9sKG92ZXJsYXlHcm91cHMgPSBjKCdIUkEgVHJhY3QgYnkgUG9wLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSFJBcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAndG9wcmlnaHQnLG9wdGlvbnMgPSBsYXllcnNDb250cm9sT3B0aW9ucyhGQUxTRSkpCn0KCnNob3dfaHJhX3RyX2h1IDwtIGZ1bmN0aW9uKCl7CiAgICAgICAgbXlMZmx0R3JleShidW1wTGFiZWxzID0gRkFMU0UsaGlkZUNvbnRyb2xzID0gRkFMU0UpICU+JQogICAgICAgIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIpICU+JSAKICAgICAgICBhZGRQb2x5Z29ucyhkYXRhID0ga2NfaHJhX3RyX3NwLAogICAgICAgICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGNvbDJoZXgoIndoaXRlIiksCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IC44NSwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsX2h1KHNodWZmbGVkX2hyYV9odSksCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuNSwKICAgICAgICAgICAgICAgICAgICBncm91cCA9ICdIUkEgVHJhY3QgYnkgSFUuJywKICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IH5wYXN0ZTAoa2NfaHJhX3RyX3NwJEdFT0lEX1RSKSkgJT4lIAogICAgICAgIGFkZFBvbHlnb25zKGRhdGEgPSBocmEsCiAgICAgICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMCwKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9IH5wYWxfaHUoZmFjdG9yKGhyYSRIUkEyMDEwdjJfLGxldmVscyA9IGxldmVscyhzaHVmZmxlZF9ocmFfaHUpLG9yZGVyZWQgPSBUUlVFKSksCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAnSFJBcycsCiAgICAgICAgICAgICAgICAgICAgcG9wdXAgPSB+cGFzdGUwKGhyYSRIUkEyMDEwdjJfKSkgJT4lIAogICAgICAgIGFkZExheWVyc0NvbnRyb2wob3ZlcmxheUdyb3VwcyA9IGMoJ0hSQSBUcmFjdCBieSBIVS4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hSQXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gJ3RvcHJpZ2h0JyxvcHRpb25zID0gbGF5ZXJzQ29udHJvbE9wdGlvbnMoRkFMU0UpKQp9CgpzaG93X2hyYV90cl9wb3BodSA8LSBmdW5jdGlvbigpewogICAgICAgIG15TGZsdEdyZXkoYnVtcExhYmVscyA9IEZBTFNFLGhpZGVDb250cm9scyA9IEZBTFNFKSAlPiUKICAgICAgICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGtjX2hyYV90cl9zcCwKICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLAogICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IDEsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjb2wyaGV4KCJ3aGl0ZSIpLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAuODUsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbF9wb3BodShzaHVmZmxlZF9ocmFfcG9waHUpLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjUsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAnSFJBIFRyYWN0IGJ5IFBvcC4gaW4gSFUnLAogICAgICAgICAgICAgICAgICAgIHBvcHVwID0gfnBhc3RlMChrY19ocmFfdHJfc3AkR0VPSURfVFIpKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGhyYSwKICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgPSAyLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gfnBhbF9wb3BodShmYWN0b3IoaHJhJEhSQTIwMTB2Ml8sbGV2ZWxzID0gbGV2ZWxzKHNodWZmbGVkX2hyYV9wb3BodSksb3JkZXJlZCA9IFRSVUUpKSwKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgICAgICBncm91cCA9ICdIUkFzJywKICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IH5wYXN0ZTAoaHJhJEhSQTIwMTB2Ml8pKSAlPiUgCiAgICAgICAgYWRkTGF5ZXJzQ29udHJvbChvdmVybGF5R3JvdXBzID0gYygnSFJBIFRyYWN0IGJ5IFBvcC4gaW4gSFUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hSQXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gJ3RvcHJpZ2h0JyxvcHRpb25zID0gbGF5ZXJzQ29udHJvbE9wdGlvbnMoRkFMU0UpKQp9CgojIFNhdmUgdGhlIG1hcHMgYXMgSFRNTCBkb2N1bWVudHMKCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9ocmEtdHJhY3RzLXBvcC5odG1sJykpKXsKICAgICAgICBzaG93X2hyYV90cl9wb3AoKSAlPiUgCiAgICAgICAgc2F2ZVdpZGdldChmaWxlID0gcm9vdF9maWxlKCczLWNvbW11bmljYXRpb24vb3RoZXJzL2h0bWwvaHJhLXRyYWN0cy1wb3AuaHRtbCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmY29udGFpbmVkID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmRpciA9IHJvb3RfZmlsZSgnMy1jb21tdW5pY2F0aW9uL290aGVycy9odG1sL2h0bWxfc3VwcG9ydF9maWxlcycpKQp9CgppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCczLWNvbW11bmljYXRpb24vb3RoZXJzL2h0bWwvaHJhLXRyYWN0cy1odS5odG1sJykpKXsKICAgICAgICBzaG93X2hyYV90cl9wb3AoKSAlPiUgCiAgICAgICAgc2F2ZVdpZGdldChmaWxlID0gcm9vdF9maWxlKCczLWNvbW11bmljYXRpb24vb3RoZXJzL2h0bWwvaHJhLXRyYWN0cy1odS5odG1sJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZjb250YWluZWQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliZGlyID0gcm9vdF9maWxlKCczLWNvbW11bmljYXRpb24vb3RoZXJzL2h0bWwvaHRtbF9zdXBwb3J0X2ZpbGVzJykpCn0KCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9ocmEtdHJhY3RzLXBvcGh1Lmh0bWwnKSkpewogICAgICAgIHNob3dfaHJhX3RyX3BvcCgpICU+JSAKICAgICAgICBzYXZlV2lkZ2V0KGZpbGUgPSByb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9ocmEtdHJhY3RzLXBvcGh1Lmh0bWwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZmNvbnRhaW5lZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJkaXIgPSByb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9odG1sX3N1cHBvcnRfZmlsZXMnKSkKfQoKCmBgYAoKCmBgYHtyIGhyYS1zaG93LXBvcCwgZmlnLmNhcD0nSFJBIENlbnN1cyBUcmFjdHMgKGJ5IFBvcHVsYXRpb24pJ30Kc2hvd19ocmFfdHJfcG9wKCkKCmBgYAoKYGBge3IgaHJhLXNob3ctaHUsIGZpZy5jYXA9J0hSQSBDZW5zdXMgVHJhY3RzIChieSBIb3VzaW5nIFVuaXRzKSd9CnNob3dfaHJhX3RyX2h1KCkKCmBgYAoKYGBge3IgaHJhLXNob3ctcG9waHUsIGZpZy5jYXA9J0hSQSBDZW5zdXMgVHJhY3RzIChieSBQb3B1bGF0aW9uIGluIEhvdXNpbmcgVW5pdHMpJ30Kc2hvd19ocmFfdHJfcG9waHUoKQoKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK